dracut: Add ostree-remount
authorColin Walters <walters@verbum.org>
Tue, 4 Jun 2013 17:18:36 +0000 (13:18 -0400)
committerColin Walters <walters@verbum.org>
Tue, 4 Jun 2013 19:59:52 +0000 (15:59 -0400)
Linux creates a copy of the soure mount flags when creating a bind
mount; if the source is read-only, then the bind mount is.

The problem is that systemd will remount the rootfs read/write, but
each mount (/home, /var etc.) will still be read-only.  We need to
remount every bind mount except for /usr to read-write too.

This only "worked" with the old ostree-switch-root because it
effectively force mounted the rootfs read-write always, ignoring the
"ro" flag.

Makefile-dracut.am
Makefile-libostree.am
Makefile-switchroot.am
Makefile.am
src/dracut/ostree-remount.service [new file with mode: 0644]
src/switchroot/ostree-mount-util.c [new file with mode: 0644]
src/switchroot/ostree-mount-util.h [new file with mode: 0644]
src/switchroot/ostree-prepare-root.c
src/switchroot/ostree-remount.c [new file with mode: 0644]
src/switchroot/ostree-switch-root.c

index 92a489554f578d4a97c91720052e6a98eddfbdc2..a81dd780922fd576bf9c3f5dd03ae1c81e24f46c 100644 (file)
@@ -23,8 +23,17 @@ dracutmoddir = $(prefix)/lib/dracut/modules.d/98ostree
 dracutmod_SCRIPTS = src/dracut/module-setup.sh
 dracutmod_DATA = src/dracut/ostree-prepare-root.service
 
+systemdunitdir = $(prefix)/lib/systemd/system
+systemdunit_DATA = src/dracut/ostree-remount.service
+
+INSTALL_DATA_HOOKS += install-remount-service-data-hook
+install-remount-service-data-hook:
+       mkdir -p $(DESTDIR)$(systemdunitdir)/local-fs.target.wants/
+       ln -s ../ostree-remount.service $(DESTDIR)$(systemdunitdir)/local-fs.target.wants/ostree-remount.service
+
 dracutconfdir = $(sysconfdir)/dracut.conf.d
 dracutconf_DATA = src/dracut/ostree.conf
 endif
 
 EXTRA_DIST += $(dracutmod_DATA) $(dracutmod_SCRIPTS)
+
index c528a26c0dbb9eab9cc47e9f5cbeb20efd5a10de..21b91996953d24ae6b03f07a2402eb5153468aa8 100644 (file)
@@ -59,5 +59,6 @@ libostree_la_CFLAGS += $(OT_DEP_LIBARCHIVE_CFLAGS)
 libostree_la_LIBADD += $(OT_DEP_LIBARCHIVE_LIBS)
 endif
 
-install-data-hook:
+INSTALL_DATA_HOOKS += install-libostree-data-hook
+install-libostree-data-hook: 
        rm -f $(DESTDIR)$(privlibdir)/libostree.la
index c75f709b028aa691c46e40d9cfca1a9f46e4d0c6..a1f05cc287b3654daa2c9dbd01a7b8acfd8270ff 100644 (file)
 
 if !TRIGGERS_ONLY
 sbin_PROGRAMS += ostree-switch-root
+if BUILDOPT_DRACUT
 sbin_PROGRAMS += ostree-prepare-root
+sbin_PROGRAMS += ostree-remount
+noinst_LTLIBRARIES += libswitchroot-mountutil.la
 endif
+endif
+
+libswitchroot_mountutil_la_SOURCES = \
+       src/switchroot/ostree-mount-util.c \
+       src/switchroot/ostree-mount-util.h \
+       $(NULL)
 
 ostree_prepare_root_SOURCES = src/switchroot/ostree-prepare-root.c
-ostree_prepare_root_CFLAGS = $(AM_CFLAGS)
+ostree_prepare_root_LDADD = libswitchroot-mountutil.la
+ostree_prepare_root_CFLAGS = $(AM_CFLAGS) -Isrc/switchroot
 
 ostree_switch_root_SOURCES = src/switchroot/ostree-switch-root.c
-ostree_switch_root_CFLAGS = $(AM_CFLAGS)
+ostree_switch_root_LDADD = libswitchroot-mountutil.la
+ostree_switch_root_CFLAGS = $(AM_CFLAGS) -Isrc/switchroot
+
+ostree_remount_SOURCES = src/switchroot/ostree-remount.c
+ostree_remount_LDADD = libswitchroot-mountutil.la
+ostree_remount_CFLAGS = $(AM_CFLAGS) -Isrc/switchroot
index 722ac7702a460830f3316deb05a74875336a77af..2f1a7935f0bfad1cd26805ebc012004160ffdea6 100644 (file)
@@ -29,6 +29,7 @@ SUBDIRS = .
 endif
 
 NULL = 
+INSTALL_DATA_HOOKS =
 BUILT_SOURCES =
 MANPAGES =
 CLEANFILES =
@@ -88,6 +89,7 @@ include Makefile-triggers.am
 include Makefile-tests.am
 include Makefile-dracut.am
 
+install-data-hook: $(INSTALL_DATA_HOOKS)
 
 #  Docbook generation copied from systemd/Makefile.am
 #
diff --git a/src/dracut/ostree-remount.service b/src/dracut/ostree-remount.service
new file mode 100644 (file)
index 0000000..0c813cc
--- /dev/null
@@ -0,0 +1,33 @@
+# Copyright (C) 2013 Colin Walters <walters@verbum.org>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+[Unit]
+Description=OSTree Remount OS/ bind mounts
+DefaultDependencies=no
+ConditionKernelCommandLine=ostree
+OnFailure=emergency.service
+Conflicts=umount.target
+After=-.mount
+After=systemd-remount-fs.service
+Before=local-fs.target umount.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/sbin/ostree-remount
+StandardInput=null
+StandardOutput=syslog
+StandardError=syslog+console
diff --git a/src/switchroot/ostree-mount-util.c b/src/switchroot/ostree-mount-util.c
new file mode 100644 (file)
index 0000000..c993c23
--- /dev/null
@@ -0,0 +1,50 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2011,2013 Colin Walters <walters@verbum.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Colin Walters <walters@verbum.org>
+ */
+
+#define _GNU_SOURCE
+
+#include <stdarg.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "ostree-mount-util.h"
+
+int
+perrorv (const char *format, ...)
+{
+  va_list args;
+  char buf[1024];
+  char *p;
+
+  p = strerror_r (errno, buf, sizeof (buf));
+
+  va_start (args, format);
+
+  vfprintf (stderr, format, args);
+  fprintf (stderr, ": %s\n", p);
+  fflush (stderr);
+
+  va_end (args);
+
+  return 0;
+}
diff --git a/src/switchroot/ostree-mount-util.h b/src/switchroot/ostree-mount-util.h
new file mode 100644 (file)
index 0000000..a6fdaff
--- /dev/null
@@ -0,0 +1,27 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2011,2013 Colin Walters <walters@verbum.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef _OSTREE_MOUNT_UTIL_H
+#define _OSTREE_MOUNT_UTIL_H
+
+int perrorv (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+#endif
index 470ed3c7a932e91b5d1f3afd5465e86010b057ce..e16d79e5ef877409c9dc60518b851a4e96375cc5 100644 (file)
 #include <ctype.h>
 #include <dirent.h>
 
-static int
-perrorv (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
-
-static int
-perrorv (const char *format, ...)
-{
-  va_list args;
-  char buf[PATH_MAX];
-  char *p;
-
-  p = strerror_r (errno, buf, sizeof (buf));
-
-  va_start (args, format);
-
-  vfprintf (stderr, format, args);
-  fprintf (stderr, ": %s\n", p);
-  fflush (stderr);
-
-  va_end (args);
-
-  sleep (3);
-       
-  return 0;
-}
+#include "ostree-mount-util.h"
 
 static void
 parse_ostree_cmdline (char **out_osname,
@@ -77,6 +54,9 @@ parse_ostree_cmdline (char **out_osname,
   if (getline (&cmdline, &len, f) < 0)
     return;
 
+  if (cmdline[len-1] == '\n')
+    cmdline[len-1] = '\0';
+
   iter = cmdline;
   while (iter != NULL)
     {
diff --git a/src/switchroot/ostree-remount.c b/src/switchroot/ostree-remount.c
new file mode 100644 (file)
index 0000000..ff5a06d
--- /dev/null
@@ -0,0 +1,79 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2011 Colin Walters <walters@verbum.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Author: Colin Walters <walters@verbum.org>
+ */
+
+#define _GNU_SOURCE
+
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "ostree-mount-util.h"
+
+int
+main(int argc, char *argv[])
+{
+  const char *remounts[] = { "/sysroot", "/etc", "/home", "/root", "/tmp", "/var", NULL };
+  struct stat stbuf;
+  int i;
+
+  if (access ("/", W_OK) == -1)
+    {
+      /* If / isn't writable, don't do any remounts; we don't want
+       * to clear the readonly flag in that case.
+       */
+      exit (0);
+    }
+
+  for (i = 0; remounts[i] != NULL; i++)
+    {
+      const char *target = remounts[i];
+      if (lstat (target, &stbuf) < 0)
+        continue;
+      /* Silently ignore symbolic links; we expect these to point to
+       * /sysroot, and thus there isn't a bind mount there.
+       */
+      if (S_ISLNK (stbuf.st_mode))
+        continue;
+      if (mount (target, target, NULL, MS_REMOUNT | MS_SILENT, NULL) < 0)
+       {
+          /* Also ignore ENINVAL - if the target isn't a mountpoint
+           * already, then assume things are OK.
+           */
+          if (errno != EINVAL)
+            {
+              perrorv ("failed to remount %s", target);
+              exit (1);
+            }
+       }
+    }
+  
+  exit (0);
+}
+
index 98c62342867beba345b979cec0bbc2e6754007e0..14b8cc24a8a9364f75563336073c2115cc697783 100644 (file)
 #include <ctype.h>
 #include <dirent.h>
 
-static int
-perrorv (const char *format, ...) __attribute__ ((format (printf, 1, 2)));
-
-static int
-perrorv (const char *format, ...)
-{
-  va_list args;
-  char buf[PATH_MAX];
-  char *p;
-
-  p = strerror_r (errno, buf, sizeof (buf));
-
-  va_start (args, format);
-
-  vfprintf (stderr, format, args);
-  fprintf (stderr, ": %s\n", p);
-  fflush (stderr);
-
-  va_end (args);
-
-  sleep (3);
-       
-  return 0;
-}
+#include "ostree-mount-util.h"
 
 /* remove all files/directories below dirName -- don't cross mountpoints */
 static int